/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package framework.db;

import framework.config.Database;
import framework.data.Pessoa;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Darlan
 */
public class PessoaManager
{
    private static PessoaManager instance;

    /**
     * 
     * @return 
     */
    public static PessoaManager getInstance()
    {
        if ( instance == null )
        {
            instance = new PessoaManager();
        }

        return instance;
    }
    
    /**
     * 
     * @return
     * @throws Exception 
     */
    private Database getDatabase() throws Exception
    {
        return Database.getInstance();
    }
    
    /**
     * 
     * @param pessoa
     * @throws Exception 
     */
    public void addPessoa( Pessoa pessoa ) throws Exception
    {
        Database db = getDatabase();
        
        pessoa.setCodigo( db.getNextId( "cadastro" ) );
        
        try
        {
            String sql = "insert into cadastro (" + 
                    " codigo, " +
                    " nome, " +
                    " documento1, " +
                    " documento2, " +
                    " endereco, " +
                    " numero, " +
                    " bairro, " +
                    " cd_cidade, " +
                    " cep, " +
                    " email, " +
                    " msn, " +
                    " fone1, " +
                    " fone2, " +
                    " cd_conjuge, " +
                    " atividade, " +
                    " site " +
                    " ) values ( " +
                    " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";

            PreparedStatement ps = db.prepareStatement( sql );
            
            int i = 1;
            ps.setInt( i++, pessoa.getCodigo() );
            ps.setString( i++, pessoa.getNome() );
            ps.setString( i++, pessoa.getDocumento1() );
            ps.setString( i++, pessoa.getDocumento2() );
            ps.setString( i++, pessoa.getEndereco() );
            ps.setInt( i++, pessoa.getNumeroEndereco() );
            ps.setString( i++, pessoa.getBairro() );
            ps.setInt( i++, pessoa.getCdCidade() );
            ps.setString( i++, pessoa.getCep() );
            ps.setString( i++, pessoa.getEmail() );
            ps.setString( i++, pessoa.getMsn() );
            ps.setString( i++, pessoa.getFone1() );
            ps.setString( i++, pessoa.getFone2() );
            ps.setInt( i++, pessoa.getCdConjuge() );
            ps.setString( i++, pessoa.getAtividade() );
            ps.setString( i++, pessoa.getWebsite() );
            
            ps.execute();
        }
        
        finally
        {
            db.close();
        }           
    }
    
    /**
     * 
     * @param pessoa
     * @throws Exception 
     */
    public void updatePessoa( Pessoa pessoa ) throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = "update cadastro set " + 
                    " nome = ?," +
                    " documento1 = ?," +
                    " documento2 = ?," +
                    " endereco = ?," +
                    " numero = ?," +
                    " bairro = ?," +
                    " cd_cidade = ?," +
                    " cep = ?," +
                    " email = ?," +
                    " msn = ?," +
                    " fone1 = ?," +
                    " fone2 = ?," +
                    " cd_conjuge = ?," +
                    " atividade = ?," +
                    " site = ? " +
                    " where " +
                    " codigo = ? ";

            PreparedStatement ps = db.prepareStatement( sql );
            
            int i = 1;
            ps.setString( i++, pessoa.getNome() );
            ps.setString( i++, pessoa.getDocumento1() );
            ps.setString( i++, pessoa.getDocumento2() );
            ps.setString( i++, pessoa.getEndereco() );
            ps.setInt( i++, pessoa.getNumeroEndereco() );
            ps.setString( i++, pessoa.getBairro() );
            ps.setInt( i++, pessoa.getCdCidade() );
            ps.setString( i++, pessoa.getCep() );
            ps.setString( i++, pessoa.getEmail() );
            ps.setString( i++, pessoa.getMsn() );
            ps.setString( i++, pessoa.getFone1() );
            ps.setString( i++, pessoa.getFone2() );
            ps.setInt( i++, pessoa.getCdConjuge() );
            ps.setString( i++, pessoa.getAtividade() );
            ps.setString( i++, pessoa.getWebsite() );
            ps.setInt( i++, pessoa.getCodigo() );
            
            ps.execute();
        }
        
        finally
        {
            db.close();
        }           
    }
    
    /**
     * 
     * @param p
     * @throws Exception 
     */
    public void deletePessoa( Pessoa p ) throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = "delete from cadastro where codigo = ?";
            
            PreparedStatement ps = db.prepareStatement( sql );
            
            ps.setInt( 1, p.getCodigo() );
            
            ps.execute();
        }
        
        finally
        {
            db.close();
        }
    }
    
    /**
     * 
     * @return
     * @throws Exception 
     */
    public List<Pessoa> getPessoas() throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = Selects.SELECT_PESSOA;
            
            PreparedStatement ps = db.prepareStatement( sql );
            
            return fetchPessoas( ps );
        }
        
        finally
        {
            db.close();
        }
    }
    
    /**
     * 
     * @param codigo
     * @return
     * @throws Exception 
     */
    public Pessoa getPessoa( int codigo ) throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = Selects.SELECT_PESSOA +
                    " where " +
                    " codigo = ?";
            
            PreparedStatement ps = db.prepareStatement( sql );
            
            ps.setInt( 1, codigo );
            
            return fetchPessoa( ps );
        }
        
        finally
        {
            db.close();
        }
    }
    
    /**
     * 
     * @param st
     * @return
     * @throws Exception 
     */
    private List<Pessoa> fetchPessoas( PreparedStatement st ) throws Exception
    {
        ResultSet rs = st.executeQuery();
        
        List<Pessoa> usuarios = new ArrayList<Pessoa>();
        
        while ( rs.next() )
        {
            Pessoa pessoa = new Pessoa();
        
            int i = 1;
            pessoa.setCodigo( rs.getInt( i++ ) );
            pessoa.setNome( rs.getString( i++ ) );
            pessoa.setDocumento1( rs.getString( i++ ) );
            pessoa.setDocumento2( rs.getString( i++ ) );
            pessoa.setEndereco( rs.getString( i++ ) );
            pessoa.setEnderecoNumero( rs.getInt( i++ ) );
            pessoa.setBairro( rs.getString( i++ ) );
            pessoa.setCdCidade( rs.getInt( i++ ) );
            pessoa.setCep( rs.getString( i++ ) );
            pessoa.setEmail( rs.getString( i++ ) );
            pessoa.setMsn( rs.getString( i++ ) );
            pessoa.setFone1( rs.getString( i++ ) );
            pessoa.setFone2( rs.getString( i++ ) );
            pessoa.setCdConjuge( rs.getInt( i++ ) );
            pessoa.setAtividade( rs.getString( i++ ) );
            pessoa.setWebsite( rs.getString( i++ ) );

            usuarios.add( pessoa );
        }
        
        return usuarios;
    }
    
    /**
     * 
     * @param st
     * @return
     * @throws Exception 
     */
    private Pessoa fetchPessoa( PreparedStatement st ) throws Exception
    {
        ResultSet rs = st.executeQuery();
        
        Pessoa pessoa = null;
        
        if ( rs.next() )
        {
            pessoa = new Pessoa();

            int i = 1;
            pessoa.setCodigo( rs.getInt( i++ ) );
            pessoa.setNome( rs.getString( i++ ) );
            pessoa.setDocumento1( rs.getString( i++ ) );
            pessoa.setDocumento2( rs.getString( i++ ) );
            pessoa.setEndereco( rs.getString( i++ ) );
            pessoa.setEnderecoNumero( rs.getInt( i++ ) );
            pessoa.setBairro( rs.getString( i++ ) );
            pessoa.setCdCidade( rs.getInt( i++ ) );
            pessoa.setCep( rs.getString( i++ ) );
            pessoa.setEmail( rs.getString( i++ ) );
            pessoa.setMsn( rs.getString( i++ ) );
            pessoa.setFone1( rs.getString( i++ ) );
            pessoa.setFone2( rs.getString( i++ ) );
            pessoa.setCdConjuge( rs.getInt( i++ ) );
            pessoa.setAtividade( rs.getString( i++ ) );
            pessoa.setWebsite( rs.getString( i++ ) );
        }
        
        return pessoa;
    }
}
